home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / TreeC2.mi < prev    next >
Text File  |  1992-11-24  |  35KB  |  1,037 lines

  1. IMPLEMENTATION MODULE TreeC2;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. IMPORT SYSTEM, System, IO, Tree;
  16. (* line 15 "" *)
  17.  
  18.  
  19. FROM IO        IMPORT WriteS, WriteNl;
  20. FROM Sets    IMPORT IsElement;
  21. FROM Idents    IMPORT tIdent;
  22. FROM Positions    IMPORT tPosition;
  23.  
  24. FROM Tree    IMPORT
  25.    NoTree    , tTree        , Options    , ClassCount    ,
  26.    f        , WI    , WN    , iInteger    , itTree    ,
  27.    iNoTree    , iModule    , iMain        , HasChildren    ,
  28.    HasAttributes, NoCodeAttr    , NoCodeClass    ,
  29.    ForallClasses, ForallAttributes, Reverse    ;
  30.  
  31. VAR
  32.    iClassName    : tIdent;
  33.    RevChild    : tTree;
  34.  
  35. PROCEDURE WriteLine (Line: tPosition);
  36.    BEGIN
  37.       IF Line.Line # 0 THEN
  38.      IF IsElement (ORD ('6'), Options) THEN
  39.         WriteS (f, "# line "); WN (Line.Line); WriteS (f, ' "'); WI (Line.File); WriteS (f, '"'); WriteNl (f);
  40.      ELSE
  41.         WriteS (f, "/* line "); WN (Line.Line); WriteS (f, ' "'); WI (Line.File); WriteS (f, '" */'); WriteNl (f);
  42.      END;
  43.       END;
  44.    END WriteLine;
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145. PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
  146.  BEGIN
  147.   IO.WriteS (IO.StdError, 'Error: module TreeC2, routine ');
  148.   IO.WriteS (IO.StdError, yyFunction);
  149.   IO.WriteS (IO.StdError, ' failed');
  150.   IO.WriteNl (IO.StdError);
  151.   Exit;
  152.  END yyAbort;
  153.  
  154. PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
  155.  VAR yyi    : INTEGER;
  156.  BEGIN
  157.   FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
  158.    IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
  159.   END;
  160.   RETURN TRUE;
  161.  END yyIsEqual;
  162.  
  163. PROCEDURE TreeIO (t: Tree.tTree);
  164.  VAR yyTempo: RECORD CASE : INTEGER OF
  165.  END; END;
  166.  BEGIN
  167.   IF t = Tree.NoTree THEN RETURN; END;
  168.   IF (t^.Kind = Tree.Ag) THEN
  169. (* line 47 "" *)
  170.      WITH t^.Ag DO
  171. (* line 47 "" *)
  172.       
  173.     WriteS (f, "typedef "); WI (itTree); WriteS (f, " * yyPtrtTree;"); WriteNl (f);
  174.     WriteNl (f);
  175.     WriteS (f, "static FILE * yyf;"); WriteNl (f);
  176.     WriteNl (f);
  177.       IF IsElement (ORD (','), Options) THEN
  178.     WriteS (f, "static void yyMark"); WriteNl (f);
  179.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  180.     WriteS (f, " (register "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  181.     WriteS (f, "# else"); WriteNl (f);
  182.     WriteS (f, " (yyt) register "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  183.     WriteS (f, "# endif"); WriteNl (f);
  184.     WriteS (f, "{"); WriteNl (f);
  185.     WriteS (f, " for (;;) {"); WriteNl (f);
  186.     WriteS (f, "  if (yyt == "); WI (iNoTree); WriteS (f, " || ++ yyt->yyHead.yyMark > 1) return;"); WriteNl (f);
  187.     WriteNl (f);
  188.     WriteS (f, "  switch (yyt->Kind) {"); WriteNl (f);
  189.     ForallClasses (Classes, Mark);
  190.     WriteS (f, "  default: return;"); WriteNl (f);
  191.     WriteS (f, "  }"); WriteNl (f);
  192.     WriteS (f, " }"); WriteNl (f);
  193.     WriteS (f, "}"); WriteNl (f);
  194.     WriteNl (f);
  195.       END;
  196.       IF IsElement (ORD (';'), Options) THEN
  197.         WriteS (f, "# define yyInitTreeStoreSize 32"); WriteNl (f);
  198.     WriteS (f, "# define yyMapToTree(yyLabel) yyTreeStorePtr [yyLabel]"); WriteNl (f);
  199.     WriteNl (f);
  200.         WriteS (f, "static unsigned long yyTreeStoreSize = yyInitTreeStoreSize;"); WriteNl (f);
  201.         WriteS (f, "static "); WI (itTree); WriteS (f, " yyTreeStore [yyInitTreeStoreSize];"); WriteNl (f);
  202.         WriteS (f, "static "); WI (itTree); WriteS (f, " * yyTreeStorePtr = yyTreeStore;"); WriteNl (f);
  203.     WriteS (f, "static int yyLabelCount;"); WriteNl (f);
  204.     WriteS (f, "static short yyRecursionLevel = 0;"); WriteNl (f);
  205.     WriteNl (f);
  206.     WriteS (f, "static "); WI (iMain); WriteS (f, "_tLabel yyMapToLabel"); WriteNl (f);
  207.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  208.     WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  209.     WriteS (f, "# else"); WriteNl (f);
  210.     WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  211.     WriteS (f, "# endif"); WriteNl (f);
  212.     WriteS (f, "{"); WriteNl (f);
  213.     WriteS (f, " register int yyi;"); WriteNl (f);
  214.     WriteS (f, " for (yyi = 1; yyi <= yyLabelCount; yyi ++) if (yyTreeStorePtr [yyi] == yyt) return yyi;"); WriteNl (f);
  215.     WriteS (f, " if (++ yyLabelCount == yyTreeStoreSize)"); WriteNl (f);
  216.     WriteS (f, "  ExtendArray ((char * *) & yyTreeStorePtr, & yyTreeStoreSize, sizeof ("); WI (itTree); WriteS (f, "));"); WriteNl (f);
  217.     WriteS (f, " yyTreeStorePtr [yyLabelCount] = yyt;"); WriteNl (f);
  218.     WriteS (f, " return yyLabelCount;"); WriteNl (f);
  219.     WriteS (f, "}"); WriteNl (f);
  220.     WriteNl (f);
  221.       END;
  222.       IF IsElement (ORD ('w'), Options) OR
  223.      IsElement (ORD ('o'), Options) THEN
  224.     WriteS (f, "static void yyWrite"); WI (iModule); WriteS (f, " ();"); WriteNl (f);
  225.     WriteNl (f);
  226.     WriteS (f, "static void yyWriteNl () { (void) putc ('\n', yyf); }"); WriteNl (f);
  227.     WriteNl (f);
  228.     WriteS (f, "static void yyWriteSelector"); WriteNl (f);
  229.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  230.     WriteS (f, " (char * yys)"); WriteNl (f);
  231.     WriteS (f, "# else"); WriteNl (f);
  232.     WriteS (f, " (yys) char * yys;"); WriteNl (f);
  233.     WriteS (f, "# endif"); WriteNl (f);
  234.     WriteS (f, "{"); WriteNl (f);
  235.     WriteS (f, " register int yyi = 16 - strlen (yys);"); WriteNl (f);
  236.     WriteS (f, ' (void) fputs (yys, yyf);'); WriteNl (f);
  237.     WriteS (f, " while (yyi -- > 0) (void) putc (' ', yyf);"); WriteNl (f);
  238.     WriteS (f, ' (void) fputs (" = ", yyf);'); WriteNl (f);
  239.     WriteS (f, "}"); WriteNl (f);
  240.     WriteNl (f);
  241.     WriteS (f, "static void yyWriteHex"); WriteNl (f);
  242.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  243.     WriteS (f, " (unsigned char * yyx, int yysize)"); WriteNl (f);
  244.     WriteS (f, "# else"); WriteNl (f);
  245.     WriteS (f, " (yyx, yysize) unsigned char * yyx; int yysize;"); WriteNl (f);
  246.     WriteS (f, "# endif"); WriteNl (f);
  247.     WriteS (f, '{ register int yyi; for (yyi = 0; yyi < yysize; yyi ++) (void) fprintf (yyf, "%02x ", yyx [yyi]); }'); WriteNl (f);
  248.     WriteNl (f);
  249.       END;
  250.       IF IsElement (ORD ('o'), Options) THEN
  251.     WriteS (f, "static void yyWriteAdr"); WriteNl (f);
  252.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  253.     WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  254.     WriteS (f, "# else"); WriteNl (f);
  255.     WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  256.     WriteS (f, "# endif"); WriteNl (f);
  257.     WriteS (f, "{"); WriteNl (f);
  258.     WriteS (f, " if (yyt == "); WI (iNoTree); WriteS (f, ') (void) fputs ("'); WI (iNoTree); WriteS (f, '", yyf);'); WriteNl (f);
  259.     WriteS (f, " else yyWriteHex ((unsigned char *) & yyt, sizeof (yyt));"); WriteNl (f);
  260.     WriteS (f, " yyWriteNl ();"); WriteNl (f);
  261.     WriteS (f, "}"); WriteNl (f);
  262.     WriteNl (f);
  263.     ForallClasses (Classes, WriteNode);
  264.     WriteS (f, "void Write"); WI (iModule); WriteS (f, "Node"); WriteNl (f);
  265.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  266.     WriteS (f, " (FILE * yyyf, "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  267.     WriteS (f, "# else"); WriteNl (f);
  268.     WriteS (f, " (yyyf, yyt) FILE * yyyf; "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  269.     WriteS (f, "# endif"); WriteNl (f);
  270.     WriteS (f, "{"); WriteNl (f);
  271.     WriteS (f, " yyf = yyyf;"); WriteNl (f);
  272.     WriteS (f, " if (yyt == "); WI (iNoTree); WriteS (f, ') { (void) fputs ("'); WI (iNoTree); WriteS (f, '\n", yyf); return; }'); WriteNl (f);
  273.     WriteNl (f);
  274.     WriteS (f, " switch (yyt->Kind) {"); WriteNl (f);
  275.     ForallClasses (Classes, WriteNodeName);
  276.     WriteS (f, " default: ;"); WriteNl (f);
  277.     WriteS (f, " }"); WriteNl (f);
  278.     WriteS (f, "}"); WriteNl (f);
  279.     WriteNl (f);
  280.       END;
  281.       IF IsElement (ORD ('w'), Options) THEN
  282.     WriteS (f, "static short yyIndentLevel;"); WriteNl (f);
  283.     WriteNl (f);
  284.     WriteS (f, "void Write"); WI (iModule); WriteNl (f);
  285.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  286.     WriteS (f, " (FILE * yyyf, "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  287.     WriteS (f, "# else"); WriteNl (f);
  288.     WriteS (f, " (yyyf, yyt) FILE * yyyf; "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  289.     WriteS (f, "# endif"); WriteNl (f);
  290.     WriteS (f, "{"); WriteNl (f);
  291.     WriteS (f, " short yySaveLevel = yyIndentLevel;"); WriteNl (f);
  292.     WriteS (f, " yyf = yyyf;"); WriteNl (f);
  293.     WriteS (f, " if (yyRecursionLevel ++ == 0) yyLabelCount = 0;"); WriteNl (f);
  294.     WriteS (f, " yyMark (yyt);"); WriteNl (f);
  295.     WriteS (f, " yyIndentLevel = 0;"); WriteNl (f);
  296.     WriteS (f, " yyWrite"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
  297.     WriteS (f, " yyIndentLevel = yySaveLevel;"); WriteNl (f);
  298.     WriteS (f, " yyRecursionLevel --;"); WriteNl (f);
  299.     WriteS (f, "}"); WriteNl (f);
  300.     WriteNl (f);
  301.     WriteS (f, "static void yyIndentSelector"); WriteNl (f);
  302.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  303.     WriteS (f, " (char * yys)"); WriteNl (f);
  304.     WriteS (f, "# else"); WriteNl (f);
  305.     WriteS (f, " (yys) char * yys;"); WriteNl (f);
  306.     WriteS (f, "# endif"); WriteNl (f);
  307.     WriteS (f, "{"); WriteNl (f);
  308.     WriteS (f, " register int yyi;"); WriteNl (f);
  309.     WriteS (f, " for (yyi = 1; yyi <= yyIndentLevel; yyi ++) (void) putc (' ', yyf);"); WriteNl (f);
  310.     WriteS (f, " yyWriteSelector (yys);"); WriteNl (f);
  311.     WriteS (f, "}"); WriteNl (f);
  312.     WriteNl (f);
  313.     WriteS (f, "static void yyIndentSelectorTree"); WriteNl (f);
  314.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  315.     WriteS (f, " (char * yys, "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  316.     WriteS (f, "# else"); WriteNl (f);
  317.     WriteS (f, " (yys, yyt) char * yys; "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  318.     WriteS (f, "# endif"); WriteNl (f);
  319.     WriteS (f, "{ yyIndentSelector (yys); write"); WI (itTree); WriteS (f, " (yyt) }"); WriteNl (f);
  320.     WriteNl (f);
  321.     ForallClasses (Classes, WriteAttributes);
  322.     WriteS (f, "static void yyWrite"); WI (iModule); WriteNl (f);
  323.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  324.     WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  325.     WriteS (f, "# else"); WriteNl (f);
  326.     WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  327.     WriteS (f, "# endif"); WriteNl (f);
  328.     WriteS (f, "{ unsigned short yyLevel = yyIndentLevel;"); WriteNl (f);
  329.     WriteS (f, " for (;;) {"); WriteNl (f);
  330.     WriteS (f, "  if (yyt == "); WI (iNoTree); WriteS (f, ') { (void) fputs (" '); WI (iNoTree); WriteS (f, '\n", yyf); goto yyExit;'); WriteNl (f);
  331.     WriteS (f, '  } else if (yyt->yyHead.yyMark == 0) { (void) fprintf (yyf, "^%d\n", yyMapToLabel (yyt)); goto yyExit;'); WriteNl (f);
  332.     WriteS (f, "  } else if (yyt->yyHead.yyMark > 1) {"); WriteNl (f);
  333.     WriteS (f, "   register int yyi;"); WriteNl (f);
  334.     WriteS (f, '   (void) fprintf (yyf, "\n%06d:", yyMapToLabel (yyt));'); WriteNl (f);
  335.     WriteS (f, "   for (yyi = 8; yyi <= yyIndentLevel; yyi ++) (void) putc (' ', yyf);"); WriteNl (f);
  336.     WriteS (f, "  } else (void) putc (' ', yyf);"); WriteNl (f);
  337.     WriteS (f, "  yyt->yyHead.yyMark = 0;"); WriteNl (f);
  338.     WriteS (f, "  yyIndentLevel += 2;"); WriteNl (f);
  339.     WriteNl (f);
  340.     WriteS (f, "  switch (yyt->Kind) {"); WriteNl (f);
  341.     ForallClasses (Classes, WriteClassName);
  342.     WriteS (f, "  default: goto yyExit;"); WriteNl (f);
  343.     WriteS (f, "  }"); WriteNl (f);
  344.     WriteS (f, " }"); WriteNl (f);
  345.     WriteS (f, "yyExit:"); WriteNl (f);
  346.     WriteS (f, " yyIndentLevel = yyLevel;"); WriteNl (f);
  347.     WriteS (f, "}"); WriteNl (f);
  348.     WriteNl (f);
  349.       END;
  350.       IF IsElement (ORD ('r'), Options) THEN
  351.     WriteS (f, "static tIdent yyKindToIdent ["); WN (ClassCount); WriteS (f, " + 1];"); WriteNl (f);
  352.     WriteS (f, "static bool yyIsInitialized = false;"); WriteNl (f);
  353.     WriteNl (f);
  354.     WriteS (f, "static short yyMapToKind"); WriteNl (f);
  355.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  356.     WriteS (f, " (char * yys)"); WriteNl (f);
  357.     WriteS (f, "# else"); WriteNl (f);
  358.     WriteS (f, " (yys) char * yys;"); WriteNl (f);
  359.     WriteS (f, "# endif"); WriteNl (f);
  360.     WriteS (f, "{"); WriteNl (f);
  361.     WriteS (f, " register int yyk;"); WriteNl (f);
  362.     WriteS (f, " register tIdent yyi = MakeIdent ((tString) yys, strlen (yys));"); WriteNl (f);
  363.     WriteS (f, " for (yyk = 0; yyk <= "); WN (ClassCount); WriteS (f, "; yyk ++) {"); WriteNl (f);
  364.     WriteS (f, "  if (yyKindToIdent [yyk] == yyi) return yyk;"); WriteNl (f);
  365.     WriteS (f, " }"); WriteNl (f);
  366.     WriteS (f, " return 0;"); WriteNl (f);
  367.     WriteS (f, "}"); WriteNl (f);
  368.     WriteNl (f);
  369.     WriteS (f, 'static void yyReadNl () { (void) fscanf (yyf, "\n"); }'); WriteNl (f);
  370.     WriteNl (f);
  371.     WriteS (f, "static tIdent yyReadIdent ()"); WriteNl (f);
  372.     WriteS (f, "{"); WriteNl (f);
  373.     WriteS (f, " char yys [256];"); WriteNl (f);
  374.     WriteS (f, ' (void) fscanf (yyf, "%s", yys);'); WriteNl (f);
  375.     WriteS (f, " return MakeIdent ((tString) yys, strlen (yys));"); WriteNl (f);
  376.     WriteS (f, "}"); WriteNl (f);
  377.     WriteNl (f);
  378.     WriteS (f, "static void yyReadHex"); WriteNl (f);
  379.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  380.     WriteS (f, " (unsigned char * yyx, int yysize)"); WriteNl (f);
  381.     WriteS (f, "# else"); WriteNl (f);
  382.     WriteS (f, " (yyx, yysize) unsigned char * yyx; int yysize;"); WriteNl (f);
  383.     WriteS (f, "# endif"); WriteNl (f);
  384.     WriteS (f, "{"); WriteNl (f);
  385.     WriteS (f, " register int yyi; int yyk;"); WriteNl (f);
  386.     WriteS (f, ' for (yyi = 0; yyi < yysize; yyi ++) { (void) fscanf (yyf, "%x ", & yyk); yyx [yyi] = yyk; }'); WriteNl (f);
  387.     WriteS (f, "}"); WriteNl (f);
  388.     WriteNl (f);
  389.     WriteS (f, 'static void yySkip () { (void) fscanf (yyf, " %*s =%*c"); }'); WriteNl (f);
  390.     WriteNl (f);
  391.     WriteS (f, "static void yyRead"); WI (iModule); WriteNl (f);
  392.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  393.     WriteS (f, " (yyPtrtTree yyt)"); WriteNl (f);
  394.     WriteS (f, "# else"); WriteNl (f);
  395.     WriteS (f, " (yyt) yyPtrtTree yyt;"); WriteNl (f);
  396.     WriteS (f, "# endif"); WriteNl (f);
  397.     WriteS (f, "{"); WriteNl (f);
  398.     WriteS (f, " static "); WI (iMain); WriteS (f, "_tLabel yyLabel;"); WriteNl (f);
  399.     WriteS (f, " static "); WI (iMain); WriteS (f, "_tKind yyKind;"); WriteNl (f);
  400.     WriteS (f, " static char yys [256];"); WriteNl (f);
  401.     WriteS (f, " for (;;) {"); WriteNl (f);
  402.     WriteS (f, "  switch (getc (yyf)) {"); WriteNl (f);
  403.     WriteS (f, "  case '^':");WriteS (f, ' (void) fscanf (yyf, "%hd\n", & yyLabel); * yyt = yyMapToTree (yyLabel); return;'); WriteNl (f);
  404.     WriteS (f, "  case '\n': case '0':");WriteS (f, ' (void) fscanf (yyf, "%hd%*c %s\n", & yyLabel, yys);'); WriteNl (f);
  405.     WriteS (f, "   yyKind = yyMapToKind (yys); * yyt = Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  406.     WriteS (f, '   if (yyLabel != yyMapToLabel (* yyt)) { (void) fputs ("'); WI (iModule);
  407.     WriteS (f, ": error in Read"); WI (iModule); WriteS (f, '\n", stderr); '); WI (iMain); WriteS (f, "_Exit (); } break;"); WriteNl (f);
  408.     WriteS (f, "  default: ;"); WriteNl (f);
  409.     WriteS (f, '   (void) fscanf (yyf, "%s", yys);'); WriteNl (f);
  410.     WriteS (f, "   yyKind = yyMapToKind (yys);"); WriteNl (f);
  411.     WriteS (f, "   if (yyKind == 0) { * yyt = "); WI (iNoTree); WriteS (f, "; return; }"); WriteNl (f);
  412.     WriteS (f, "   * yyt = Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  413.     WriteS (f, "  }"); WriteNl (f);
  414.     WriteNl (f);
  415.     WriteS (f, "  switch (yyKind) {"); WriteNl (f);
  416.     ForallClasses (Classes, ReadAttributes);
  417.     WriteS (f, "  default: return;"); WriteNl (f);
  418.     WriteS (f, "  }"); WriteNl (f);
  419.     WriteS (f, " }"); WriteNl (f);
  420.     WriteS (f, "}"); WriteNl (f);
  421.     WriteNl (f);
  422.     WI (itTree); WriteS (f, " Read"); WI (iModule); WriteNl (f);
  423.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  424.     WriteS (f, " (FILE * yyyf)"); WriteNl (f);
  425.     WriteS (f, "# else"); WriteNl (f);
  426.     WriteS (f, " (yyyf) FILE * yyyf;"); WriteNl (f);
  427.     WriteS (f, "# endif"); WriteNl (f);
  428.     WriteS (f, "{"); WriteNl (f);
  429.     WriteS (f, " "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  430.     WriteS (f, " yyf = yyyf;"); WriteNl (f);
  431.     WriteS (f, " if (yyRecursionLevel ++ == 0) yyLabelCount = 0;"); WriteNl (f);
  432.     WriteS (f, ' if (! yyIsInitialized) {'); WriteNl (f);
  433.     WriteS (f, "  register int yyi;"); WriteNl (f);
  434.     WriteS (f, "  for (yyi = 0; yyi <= "); WN (ClassCount); WriteS (f, "; yyi ++)"); WriteNl (f);
  435.     WriteS (f, "   yyKindToIdent [yyi] = MakeIdent ((tString) "); WI (iMain); WriteS (f, "_NodeName [yyi], strlen ("); WI (iMain); WriteS (f, "_NodeName [yyi]));"); WriteNl (f);
  436.     WriteS (f, "  yyIsInitialized = true;"); WriteNl (f);
  437.     WriteS (f, " }"); WriteNl (f);
  438.     WriteS (f, " yyRead"); WI (iModule); WriteS (f, " (& yyt);"); WriteNl (f);
  439.     WriteS (f, " yyRecursionLevel --;"); WriteNl (f);
  440.     WriteS (f, " return yyt;"); WriteNl (f);
  441.     WriteS (f, "}"); WriteNl (f);
  442.     WriteNl (f);
  443.       END;
  444.     WriteS (f, "# define yyNil    0374"); WriteNl (f);
  445.     WriteS (f, "# define yyNoLabel    0375"); WriteNl (f);
  446.     WriteS (f, "# define yyLabelDef    0376"); WriteNl (f);
  447.     WriteS (f, "# define yyLabelUse    0377"); WriteNl (f);
  448.     WriteNl (f);
  449.       IF IsElement (ORD ('p'), Options) THEN
  450.     WriteS (f, "static void yyPut"); WriteNl (f);
  451.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  452.     WriteS (f, " (char * yyx, int yysize)"); WriteNl (f);
  453.     WriteS (f, "# else"); WriteNl (f);
  454.     WriteS (f, " (yyx, yysize) char * yyx; int yysize;"); WriteNl (f);
  455.     WriteS (f, "# endif"); WriteNl (f);
  456.     WriteS (f, "{ (void) fwrite (yyx, 1, yysize, yyf); }"); WriteNl (f);
  457.     WriteNl (f);
  458.     WriteS (f, "static void yyPutIdent"); WriteNl (f);
  459.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  460.     WriteS (f, " (tIdent yyi)"); WriteNl (f);
  461.     WriteS (f, "# else"); WriteNl (f);
  462.     WriteS (f, " (yyi) tIdent yyi;"); WriteNl (f);
  463.     WriteS (f, "# endif"); WriteNl (f);
  464.     WriteS (f, "{"); WriteNl (f);
  465.     WriteS (f, " char yys [256];"); WriteNl (f);
  466.     WriteS (f, " GetString (yyi, (tString) yys);"); WriteNl (f);
  467.     WriteS (f, ' (void) fprintf (yyf, "%s\n", yys);'); WriteNl (f);
  468.     WriteS (f, "}"); WriteNl (f);
  469.     WriteNl (f);
  470.     WriteS (f, "static void yyPut"); WI (iModule); WriteNl (f);
  471.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  472.     WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  473.     WriteS (f, "# else"); WriteNl (f);
  474.     WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  475.     WriteS (f, "# endif"); WriteNl (f);
  476.     WriteS (f, "{"); WriteNl (f);
  477.     WriteS (f, " static "); WI (iMain); WriteS (f, "_tLabel yyLabel;"); WriteNl (f);
  478.     WriteS (f, " for (;;) {"); WriteNl (f);
  479.     WriteS (f, "  if (yyt == "); WI (iNoTree); WriteS (f, ") {"); WriteNl (f);
  480.     WriteS (f, "   (void) putc (yyNil, yyf); return;"); WriteNl (f);
  481.     WriteS (f, "  } else if (yyt->yyHead.yyMark == 0) {"); WriteNl (f);
  482.     WriteS (f, "   (void) putc (yyLabelUse, yyf); yyLabel = yyMapToLabel (yyt); yyPut ((char *) & yyLabel, sizeof (yyLabel)); return;"); WriteNl (f);
  483.     WriteS (f, "  } else if (yyt->yyHead.yyMark > 1) {"); WriteNl (f);
  484.     WriteS (f, "   (void) putc (yyLabelDef, yyf); yyLabel = yyMapToLabel (yyt); yyPut ((char *) & yyLabel, sizeof (yyLabel));"); WriteNl (f);
  485.     IF ClassCount > 251 THEN
  486.     WriteS (f, "   yyPut ((char *) & yyt->Kind, sizeof ("); WI (iMain); WriteS (f, "_tKind));"); WriteNl (f);
  487.     WriteS (f, "  } else if (yyt->Kind > 251) {"); WriteNl (f);
  488.     WriteS (f, "   (void) putc (yyNoLabel, yyf); yyPut ((char *) & yyt->Kind, sizeof ("); WI (iMain); WriteS (f, "_tKind));"); WriteNl (f);
  489.     ELSE
  490.     WriteS (f, "   (void) putc ((char) yyt->Kind, yyf);"); WriteNl (f);
  491.     END;
  492.     WriteS (f, "  } else {"); WriteNl (f);
  493.     WriteS (f, "   (void) putc ((char) yyt->Kind, yyf);"); WriteNl (f);
  494.     WriteS (f, "  }"); WriteNl (f);
  495.     WriteS (f, "  yyt->yyHead.yyMark = 0;"); WriteNl (f);
  496.     WriteNl (f);
  497.     WriteS (f, "  switch (yyt->Kind) {"); WriteNl (f);
  498.     ForallClasses (Classes, PutAttributes);
  499.     WriteS (f, "  default: return;"); WriteNl (f);
  500.     WriteS (f, "  }"); WriteNl (f);
  501.     WriteS (f, " }"); WriteNl (f);
  502.     WriteS (f, "}"); WriteNl (f);
  503.     WriteNl (f);
  504.     WriteS (f, "void Put"); WI (iModule); WriteNl (f);
  505.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  506.     WriteS (f, " (FILE * yyyf, "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  507.     WriteS (f, "# else"); WriteNl (f);
  508.     WriteS (f, " (yyyf, yyt) FILE * yyyf; "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  509.     WriteS (f, "# endif"); WriteNl (f);
  510.     WriteS (f, "{"); WriteNl (f);
  511.     WriteS (f, " yyf = yyyf;"); WriteNl (f);
  512.     WriteS (f, " if (yyRecursionLevel ++ == 0) yyLabelCount = 0;"); WriteNl (f);
  513.     WriteS (f, " yyMark (yyt);"); WriteNl (f);
  514.     WriteS (f, " yyPut"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
  515.     WriteS (f, " yyRecursionLevel --;"); WriteNl (f);
  516.     WriteS (f, "}"); WriteNl (f);
  517.     WriteNl (f);
  518.       END;
  519.       IF IsElement (ORD ('g'), Options) THEN
  520.     WriteS (f, "static void yyGet"); WriteNl (f);
  521.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  522.     WriteS (f, " (char * yyx, int yysize)"); WriteNl (f);
  523.     WriteS (f, "# else"); WriteNl (f);
  524.     WriteS (f, " (yyx, yysize) char * yyx; int yysize;"); WriteNl (f);
  525.     WriteS (f, "# endif"); WriteNl (f);
  526.     WriteS (f, "{ (void) fread (yyx, 1, yysize, yyf); }"); WriteNl (f);
  527.     WriteNl (f);
  528.     WriteS (f, "static void yyGetIdent"); WriteNl (f);
  529.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  530.     WriteS (f, " (tIdent * yyi)"); WriteNl (f);
  531.     WriteS (f, "# else"); WriteNl (f);
  532.     WriteS (f, " (yyi) tIdent * yyi;"); WriteNl (f);
  533.     WriteS (f, "# endif"); WriteNl (f);
  534.     WriteS (f, "{"); WriteNl (f);
  535.     WriteS (f, " char yys [256];"); WriteNl (f);
  536.     WriteS (f, ' (void) fscanf (yyf, "%s%*c", yys);'); WriteNl (f);
  537.     WriteS (f, " * yyi = MakeIdent ((tString) yys, strlen (yys));"); WriteNl (f);
  538.     WriteS (f, "}"); WriteNl (f);
  539.     WriteNl (f);
  540.     WriteS (f, "static void yyGet"); WI (iModule); WriteNl (f);
  541.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  542.     WriteS (f, " (yyPtrtTree yyt)"); WriteNl (f);
  543.     WriteS (f, "# else"); WriteNl (f);
  544.     WriteS (f, " (yyt) yyPtrtTree yyt;"); WriteNl (f);
  545.     WriteS (f, "# endif"); WriteNl (f);
  546.     WriteS (f, "{"); WriteNl (f);
  547.     WriteS (f, " static "); WI (iMain); WriteS (f, "_tLabel yyLabel;"); WriteNl (f);
  548.     WriteS (f, " static "); WI (iMain); WriteS (f, "_tKind yyKind;"); WriteNl (f);
  549.     WriteS (f, " for (;;) {"); WriteNl (f);
  550.     WriteS (f, "  switch (yyKind = getc (yyf)) {"); WriteNl (f);
  551.     WriteS (f, "  case yyNil        : * yyt = "); WI (iNoTree); WriteS (f, "; return;"); WriteNl (f);
  552.     WriteS (f, "  case yyLabelUse    : yyGet ((char *) & yyLabel, sizeof (yyLabel));"); WriteNl (f);
  553.     WriteS (f, "   * yyt = yyMapToTree (yyLabel); return;"); WriteNl (f);
  554.     WriteS (f, "  case yyLabelDef    : yyGet ((char *) & yyLabel, sizeof (yyLabel));"); WriteNl (f);
  555.     IF ClassCount > 251 THEN
  556.     WriteS (f, "   yyGet ((char *) & yyKind, sizeof (yyKind));"); WriteNl (f);
  557.     ELSE
  558.     WriteS (f, "   yyKind = getc (yyf);"); 
  559.     END;
  560.     WriteS (f, "   * yyt = Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  561.     WriteS (f, '   if (yyLabel != yyMapToLabel (* yyt)) { (void) fputs ("'); WI (iModule);
  562.     WriteS (f, ": error in Get"); WI (iModule); WriteS (f, '\n", stderr); '); WI (iMain); WriteS (f, "_Exit (); } break;"); WriteNl (f);
  563.     IF ClassCount > 251 THEN
  564.     WriteS (f, "  case yyNoLabel    : yyGet ((char *) & yyKind, sizeof (yyKind));"); WriteNl (f);
  565.     WriteS (f, "   * yyt = Make"); WI (iMain); WriteS (f, " (yyKind); break;"); WriteNl (f);
  566.     END;
  567.     WriteS (f, "  default    : * yyt = Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  568.     WriteS (f, "  }"); WriteNl (f);
  569.     WriteNl (f);
  570.     WriteS (f, "  switch (yyKind) {"); WriteNl (f);
  571.     ForallClasses (Classes, GetAttributes);
  572.     WriteS (f, "  default: return;"); WriteNl (f);
  573.     WriteS (f, "  }"); WriteNl (f);
  574.     WriteS (f, " }"); WriteNl (f);
  575.     WriteS (f, "}"); WriteNl (f);
  576.     WriteNl (f);
  577.     WI (itTree); WriteS (f, " Get"); WI (iModule); WriteNl (f);
  578.     WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  579.     WriteS (f, " (FILE * yyyf)"); WriteNl (f);
  580.     WriteS (f, "# else"); WriteNl (f);
  581.     WriteS (f, " (yyyf) FILE * yyyf;"); WriteNl (f);
  582.     WriteS (f, "# endif"); WriteNl (f);
  583.     WriteS (f, "{"); WriteNl (f);
  584.     WriteS (f, " "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  585.     WriteS (f, " yyf = yyyf;"); WriteNl (f);
  586.     WriteS (f, " if (yyRecursionLevel ++ == 0) yyLabelCount = 0;"); WriteNl (f);
  587.     WriteS (f, " yyGet"); WI (iModule); WriteS (f, " (& yyt);"); WriteNl (f);
  588.     WriteS (f, " yyRecursionLevel --;"); WriteNl (f);
  589.     WriteS (f, " return yyt;"); WriteNl (f);
  590.     WriteS (f, "}"); WriteNl (f);
  591.     WriteNl (f);
  592.       END;
  593. ;
  594.       RETURN;
  595.      END;
  596.  
  597.   END;
  598.  END TreeIO;
  599.  
  600. PROCEDURE WriteNodeName (t: Tree.tTree);
  601.  VAR yyTempo: RECORD CASE : INTEGER OF
  602.  END; END;
  603.  BEGIN
  604.   IF t = Tree.NoTree THEN RETURN; END;
  605.   IF (t^.Kind = Tree.Class) THEN
  606. (* line 473 "" *)
  607.      WITH t^.Class DO
  608. (* line 473 "" *)
  609.       
  610.     IF (NoCodeClass * Properties) = {} THEN
  611.        WriteS (f, "case k"); WI (Name); WriteS (f, ": (void) fputs ("); WI (iMain); WriteS (f, "_NodeName [k"); WI (Name);
  612.        WriteS (f, "], yyf); (void) fputc ('\n', yyf);"); WriteNl (f);
  613.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  614.           WriteS (f, " yWriteNode"); WI (Name); WriteS (f, " (yyt);"); 
  615.        END;
  616.        WriteS (f, " break;"); WriteNl (f);
  617.     END;
  618. ;
  619.       RETURN;
  620.      END;
  621.  
  622.   END;
  623.  END WriteNodeName;
  624.  
  625. PROCEDURE WriteNode (t: Tree.tTree);
  626.  VAR yyTempo: RECORD CASE : INTEGER OF
  627.  END; END;
  628.  BEGIN
  629.   IF t = Tree.NoTree THEN RETURN; END;
  630.   IF (t^.Kind = Tree.Class) THEN
  631. (* line 487 "" *)
  632.      WITH t^.Class DO
  633. (* line 487 "" *)
  634.       
  635.     IF ((NoCodeClass * Properties) = {}) AND
  636.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  637.        WriteS (f, "static void yWriteNode"); WI (Name); WriteNl (f);
  638.        WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  639.        WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  640.        WriteS (f, "# else"); WriteNl (f);
  641.        WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  642.        WriteS (f, "# endif"); WriteNl (f);
  643.        WriteS (f, "{"); WriteNl (f);
  644.        IF (BaseClass^.Kind = Tree.Class) AND        (* NOT Top ? *)
  645.           (({HasChildren, HasAttributes} * BaseClass^.Class.Properties) # {}) THEN
  646.        WriteS (f, " yWriteNode"); WI (BaseClass^.Class.Name); WriteS (f, " (yyt); "); WriteNl (f);
  647.        END;
  648.        iClassName := Name;
  649.        ForallAttributes (Attributes, WriteNode);
  650.        WriteS (f, "}"); WriteNl (f);
  651.        WriteNl (f);
  652.     END;
  653. ;
  654.       RETURN;
  655.      END;
  656.  
  657.   END;
  658.   IF (t^.Kind = Tree.Child) THEN
  659. (* line 507 "" *)
  660.      WITH t^.Child DO
  661. (* line 507 "" *)
  662.       
  663.     WriteS (f, ' yyWriteSelector ("'); WI (Name); WriteS (f, '");'); 
  664.     WriteS (f, " yyWriteAdr (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  665. ;
  666.       RETURN;
  667.      END;
  668.  
  669.   END;
  670.   IF (t^.Kind = Tree.Attribute) THEN
  671. (* line 511 "" *)
  672.      WITH t^.Attribute DO
  673. (* line 511 "" *)
  674.       
  675.     IF (NoCodeAttr * Properties) = {} THEN 
  676.        WriteS (f, ' yyWriteSelector ("'); WI (Name); WriteS (f, '"); write'); WI (Type);
  677.        WriteS (f, " (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl ();"); WriteNl (f);
  678.     END;
  679. ;
  680.       RETURN;
  681.      END;
  682.  
  683.   END;
  684.  END WriteNode;
  685.  
  686. PROCEDURE Mark (t: Tree.tTree);
  687.  VAR yyTempo: RECORD CASE : INTEGER OF
  688.  END; END;
  689.  BEGIN
  690.   IF t = Tree.NoTree THEN RETURN; END;
  691.   IF (t^.Kind = Tree.Class) THEN
  692. (* line 521 "" *)
  693.      WITH t^.Class DO
  694. (* line 521 "" *)
  695.       
  696.     IF ((NoCodeClass * Properties) = {}) AND (HasChildren IN Properties) THEN
  697.        WriteS (f, "case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
  698.        GetIterator (t);
  699.        iClassName := Name;
  700.        ForallAttributes (t, Mark);
  701.        IF Iterator = NoTree THEN
  702.           WriteS (f, "return;"); WriteNl (f);
  703.        ELSE
  704.           WriteS (f, "yyt = yyt->"); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "; break;"); WriteNl (f);
  705.        END;
  706.     END;
  707. ;
  708.       RETURN;
  709.      END;
  710.  
  711.   END;
  712.   IF (t^.Kind = Tree.Child) THEN
  713. (* line 534 "" *)
  714.      WITH t^.Child DO
  715. (* line 534 "" *)
  716.       
  717.     IF t # Iterator THEN
  718.        WriteS (f, "yyMark (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  719.     END;
  720. ;
  721.       RETURN;
  722.      END;
  723.  
  724.   END;
  725.  END Mark;
  726.  
  727. PROCEDURE WriteClassName (t: Tree.tTree);
  728.  VAR yyTempo: RECORD CASE : INTEGER OF
  729.  END; END;
  730.  BEGIN
  731.   IF t = Tree.NoTree THEN RETURN; END;
  732.   IF (t^.Kind = Tree.Class) THEN
  733. (* line 543 "" *)
  734.      WITH t^.Class DO
  735. (* line 543 "" *)
  736.       
  737.     IF (NoCodeClass * Properties) = {} THEN
  738.        WriteS (f, "case k"); WI (Name); WriteS (f, ": "); 
  739.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  740.           WriteS (f, "yWrite"); WI (Name); WriteS (f, " (yyt); "); 
  741.           GetIterator (t);
  742.           IF Iterator = NoTree THEN
  743.          WriteS (f, "goto yyExit;"); WriteNl (f);
  744.           ELSE
  745.          WriteS (f, 'yyIndentSelector ("'); WI (Iterator^.Child.Name); WriteS (f, '"); '); 
  746.          WriteS (f, "yyt = yyt->"); WI (Name); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "; break;"); WriteNl (f);
  747.           END;
  748.        ELSE
  749.           WriteS (f, "(void) fputs ("); WI (iMain); WriteS (f, "_NodeName [k"); WI (Name);
  750.           WriteS (f, "], yyf); (void) fputc ('\n', yyf); goto yyExit;"); WriteNl (f);
  751.        END;
  752.     END;
  753. ;
  754.       RETURN;
  755.      END;
  756.  
  757.   END;
  758.  END WriteClassName;
  759.  
  760. PROCEDURE WriteAttributes (t: Tree.tTree);
  761.  VAR yyTempo: RECORD CASE : INTEGER OF
  762.  END; END;
  763.  BEGIN
  764.   IF t = Tree.NoTree THEN RETURN; END;
  765.   IF (t^.Kind = Tree.Class) THEN
  766. (* line 565 "" *)
  767.      WITH t^.Class DO
  768. (* line 565 "" *)
  769.       
  770.     IF ((NoCodeClass * Properties) = {}) AND
  771.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  772.        WriteS (f, "static void yWrite"); WI (Name); WriteNl (f);
  773.        WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
  774.        WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
  775.        WriteS (f, "# else"); WriteNl (f);
  776.        WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
  777.        WriteS (f, "# endif"); WriteNl (f);
  778.        WriteS (f, "{"); WriteNl (f);
  779.        WriteS (f, " (void) fputs ("); WI (iMain); WriteS (f, "_NodeName [k"); WI (Name);
  780.        WriteS (f, "], yyf); (void) fputc ('\n', yyf);"); WriteNl (f);
  781.        GetIterator (t);
  782.        iClassName := Name;
  783.        ForallAttributes (t, WriteAttributes);
  784.        WriteS (f, "}"); WriteNl (f);
  785.        WriteNl (f);
  786.     END;
  787. ;
  788.       RETURN;
  789.      END;
  790.  
  791.   END;
  792.   IF (t^.Kind = Tree.Child) THEN
  793. (* line 584 "" *)
  794.      WITH t^.Child DO
  795. (* line 584 "" *)
  796.       
  797.     IF t # Iterator THEN
  798.        WriteS (f, ' yyIndentSelectorTree ("'); WI (Name); WriteS (f, '", yyt->'); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  799.     END;
  800. ;
  801.       RETURN;
  802.      END;
  803.  
  804.   END;
  805.   IF (t^.Kind = Tree.Attribute) THEN
  806. (* line 589 "" *)
  807.      WITH t^.Attribute DO
  808. (* line 589 "" *)
  809.       
  810.     IF (NoCodeAttr * Properties) = {} THEN 
  811.        WriteS (f, ' yyIndentSelector ("'); WI (Name); WriteS (f, '"); '); 
  812.        WriteS (f, "write"); WI (Type); WriteS (f, " (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl ();"); WriteNl (f);
  813.     END;
  814. ;
  815.       RETURN;
  816.      END;
  817.  
  818.   END;
  819.  END WriteAttributes;
  820.  
  821. PROCEDURE ReadAttributes (t: Tree.tTree);
  822.  VAR yyTempo: RECORD CASE : INTEGER OF
  823.  END; END;
  824.  BEGIN
  825.   IF t = Tree.NoTree THEN RETURN; END;
  826.   IF (t^.Kind = Tree.Class) THEN
  827. (* line 599 "" *)
  828.      WITH t^.Class DO
  829. (* line 599 "" *)
  830.       
  831.     IF ((NoCodeClass * Properties) = {}) AND
  832.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  833.        WriteS (f, "case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
  834.        GetIterator (t);
  835.        iClassName := Name;
  836.        ForallAttributes (t, ReadAttributes);
  837.        IF Iterator = NoTree THEN
  838.           WriteS (f, "return;"); WriteNl (f);
  839.        ELSE
  840.           WriteS (f, "yySkip (); yyt = & ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "); break;"); WriteNl (f);
  841.        END;
  842.     END;
  843. ;
  844.       RETURN;
  845.      END;
  846.  
  847.   END;
  848.   IF (t^.Kind = Tree.Child) THEN
  849. (* line 613 "" *)
  850.      WITH t^.Child DO
  851. (* line 613 "" *)
  852.       
  853.     IF t # Iterator THEN
  854.        WriteS (f, "yySkip (); read"); WI (itTree); WriteS (f, " (& ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
  855.     END;
  856. ;
  857.       RETURN;
  858.      END;
  859.  
  860.   END;
  861.   IF (t^.Kind = Tree.Attribute) THEN
  862. (* line 618 "" *)
  863.      WITH t^.Attribute DO
  864. (* line 618 "" *)
  865.       
  866.     IF (NoCodeAttr * Properties) = {} THEN 
  867.        WriteS (f, "yySkip (); read"); WI (Type); WriteS (f, " ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyReadNl ();"); WriteNl (f);
  868.     END;
  869. ;
  870.       RETURN;
  871.      END;
  872.  
  873.   END;
  874.  END ReadAttributes;
  875.  
  876. PROCEDURE PutAttributes (t: Tree.tTree);
  877.  VAR yyTempo: RECORD CASE : INTEGER OF
  878.  END; END;
  879.  BEGIN
  880.   IF t = Tree.NoTree THEN RETURN; END;
  881.   IF (t^.Kind = Tree.Class) THEN
  882. (* line 627 "" *)
  883.      WITH t^.Class DO
  884. (* line 627 "" *)
  885.       
  886.     IF ((NoCodeClass * Properties) = {}) AND
  887.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  888.        WriteS (f, "case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
  889.        GetIterator (t);
  890.        iClassName := Name;
  891.        ForallAttributes (t, PutAttributes);
  892.        IF Iterator = NoTree THEN
  893.           WriteS (f, "return;"); WriteNl (f);
  894.        ELSE
  895.           WriteS (f, "yyt = yyt->"); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "; break;"); WriteNl (f);
  896.        END;
  897.     END;
  898. ;
  899.       RETURN;
  900.      END;
  901.  
  902.   END;
  903.   IF (t^.Kind = Tree.Child) THEN
  904. (* line 641 "" *)
  905.      WITH t^.Child DO
  906. (* line 641 "" *)
  907.       
  908.     IF t # Iterator THEN
  909.        WriteS (f, "put"); WI (itTree); WriteS (f, " (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  910.     END;
  911. ;
  912.       RETURN;
  913.      END;
  914.  
  915.   END;
  916.   IF (t^.Kind = Tree.Attribute) THEN
  917. (* line 646 "" *)
  918.      WITH t^.Attribute DO
  919. (* line 646 "" *)
  920.       
  921.     IF (NoCodeAttr * Properties) = {} THEN 
  922.        WriteS (f, "put"); WI (Type); WriteS (f, " (yyt->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  923.     END;
  924. ;
  925.       RETURN;
  926.      END;
  927.  
  928.   END;
  929.  END PutAttributes;
  930.  
  931. PROCEDURE GetAttributes (t: Tree.tTree);
  932.  VAR yyTempo: RECORD CASE : INTEGER OF
  933.  END; END;
  934.  BEGIN
  935.   IF t = Tree.NoTree THEN RETURN; END;
  936.   IF (t^.Kind = Tree.Class) THEN
  937. (* line 655 "" *)
  938.      WITH t^.Class DO
  939. (* line 655 "" *)
  940.       
  941.     IF ((NoCodeClass * Properties) = {}) AND
  942.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  943.        WriteS (f, "case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
  944.        GetIterator (t);
  945.        iClassName := Name;
  946.        ForallAttributes (t, GetAttributes);
  947.        IF Iterator = NoTree THEN
  948.           WriteS (f, "return;"); WriteNl (f);
  949.        ELSE
  950.           WriteS (f, "yyt = & ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "); break;"); WriteNl (f);
  951.        END;
  952.     END;
  953. ;
  954.       RETURN;
  955.      END;
  956.  
  957.   END;
  958.   IF (t^.Kind = Tree.Child) THEN
  959. (* line 669 "" *)
  960.      WITH t^.Child DO
  961. (* line 669 "" *)
  962.       
  963.     IF t # Iterator THEN
  964.        WriteS (f, "get"); WI (itTree); WriteS (f, " (& ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
  965.     END;
  966. ;
  967.       RETURN;
  968.      END;
  969.  
  970.   END;
  971.   IF (t^.Kind = Tree.Attribute) THEN
  972. (* line 674 "" *)
  973.      WITH t^.Attribute DO
  974. (* line 674 "" *)
  975.       
  976.     IF (NoCodeAttr * Properties) = {} THEN 
  977.        WriteS (f, "get"); WI (Type); WriteS (f, " ((* yyt)->"); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  978.     END;
  979. ;
  980.       RETURN;
  981.      END;
  982.  
  983.   END;
  984.  END GetAttributes;
  985.  
  986. PROCEDURE GetIterator (t: Tree.tTree);
  987.  VAR yyTempo: RECORD CASE : INTEGER OF
  988.  END; END;
  989.  BEGIN
  990.   IF t = Tree.NoTree THEN RETURN; END;
  991.   IF (t^.Kind = Tree.Class) THEN
  992. (* line 683 "" *)
  993.      WITH t^.Class DO
  994. (* line 683 "" *)
  995.       
  996.     Iterator := NoTree;
  997.     RevChild := NoTree;
  998.     ForallAttributes (t, GetIterator);
  999.     IF RevChild # NoTree THEN Iterator := RevChild; END;
  1000. ;
  1001.       RETURN;
  1002.      END;
  1003.  
  1004.   END;
  1005.   IF (t^.Kind = Tree.Child) THEN
  1006. (* line 689 "" *)
  1007.      WITH t^.Child DO
  1008. (* line 689 "" *)
  1009.       
  1010.     Iterator := t;
  1011.     IF Reverse IN Properties THEN RevChild := t; END;
  1012. ;
  1013.       RETURN;
  1014.      END;
  1015.  
  1016.   END;
  1017.  END GetIterator;
  1018.  
  1019. PROCEDURE BeginTreeC2;
  1020.  BEGIN
  1021.  END BeginTreeC2;
  1022.  
  1023. PROCEDURE CloseTreeC2;
  1024.  BEGIN
  1025.  END CloseTreeC2;
  1026.  
  1027. PROCEDURE yyExit;
  1028.  BEGIN
  1029.   IO.CloseIO; System.Exit (1);
  1030.  END yyExit;
  1031.  
  1032. BEGIN
  1033.  yyf    := IO.StdOutput;
  1034.  Exit    := yyExit;
  1035.  BeginTreeC2;
  1036. END TreeC2.
  1037.